5 kyu
驗證 str1 是否可以排列成 str2,如果可以返回 true,否則返回 false。
function scramble(str1, str2) {
const counter = {};
for (let i = 0; i < str1.length; i++) {
if(counter[str1[i]]){
counter[str1[i]]++;
}else{
counter[str1[i]] = 1;
}
}
for (let i = 0; i < str2.length; i++) {
if (!counter[str2[i]]) {
return false;
} else {
counter[str2[i]]--;
}
}
return true;
}
直接使用 counter 技巧,首先紀錄 str1 存在哪些字元。
利用 for 迴圈迭代,counter 物件紀錄存在的字元以及個數。if(counter[str1[i]])
如果條件成立,把物件中的 value++;否則新增該元素並且賦值為 1。
然後一樣 for 迴圈跑 str2,與第一個是相反做法;
如果 if (!counter[str2[i]])
條件成立,則表示 str1 不存在該字元,直接返回 false。
迭代完成若都沒有跳出,返回 true。
function scramble(str1, str2) {
let occurences = str1.split("").reduce((arr, cur) => { arr[cur] ? arr[cur]++ : arr[cur] = 1; return arr; }, {});
return str2.split("").every((character) => --occurences[character] >= 0);
}
最佳解也是同樣概念的解法。
reduce 這段以空物件來迭代 str1 的陣列,最後返回一個紀錄有哪些字元的物件 occurences。
str2 以 every 驗證條件是否完全符合,只有完全符合才會返回 true,否則都是 false。
雖然邏輯相通,大抵上做的事也都一樣。
但最佳解除了更加簡潔之外,也不會難讀,程式還是容易就能看懂。